"""
元组的特性：
1、元组的内部结构是不可变的，不可以增删改
2、元组是有序的，支持索引、切片
"""
# 元组的创建
import random

"""
a = (1,2,3)
print(a)
print(a[0]) # 1
print(a[-1]) # 3
# 元组中的原生对象是不可以被修改的
#a[0] = 99 # 错误，元组被定义好了后，不可以修改内部结构
# 元组里有可变对象列表时，是可以修改的
b = (90,200,"asd",[100,200])
b[3][0] = 300 # 可不可以改掉呢？
print(b)

c = (10,) #创建只有一个值的元组，这样做是错误的
print(c)
print(type(c))
"""
# 元组的元素访问
"""
a=(20,10,30,9,8,20)
print(a[1]) # 10
print(a[1:3]) # (10,30)
print(a[:]) # (20, 10, 30, 9, 8)
print(a[::-1]) # 倒序 (8, 9, 30, 10, 20)
# 获取元组的下标和计数
print(a.index(30)) # 2
print(a.count(20)) # 1
"""
# 使用sorted 排序
"""
print(tuple(sorted(a))) # (8, 9, 10, 20, 20, 30)
# sorted 将序列升序，并且把原来的数据结构换成列表
# tuple，将数据结构强转成 元组对象
"""
# 元组的拼接
"""
a = 1,20
b = 30,20
print(a+b) # (1,20,30,20),相当于创建了一个新的元组对象
"""
# 元组长度、最大值、最小值、求和
"""
print(f"元组的长度为{len(a)},元组的最大值是{max(a)},元组的最小值是{min(a)}，元组的和是{sum(a)}")
"""
"""
a=[10,20,30]
b=[40,50,60]
c=[60,80,90]
bb=zip(a,b,c)
print(bb) # <zip object at 0x020806C0>
print(list(bb)) # [(10,40,60),(20,50,80),(30,60,90)]

d = [tuple(a) , tuple(b) , tuple(c)]
print(d)
"""
# 生成器的使用测试
"""
s = (x*2 for x in range(5)) # 0 ,1 ,2 ,3,4
print(s) # 生成器，只能被访问一次，第二次就为空了
# <generator object <genexpr> at 0x00A610B0>
# print(tuple(s)) #
print(list(s)) #只能访问一次元素,第二次就为空了,需要在生成一次
"""
x = (x*2 for x in range(5)) # 创建生成器对象
print(x.__next__()) # 0 next方法，可以打印下一个值
print(x.__next__()) # 2
print(x.__next__()) # 4
print(x.__next__()) # 6
print(x.__next__()) # 8
# print(x.__next__()) # 10 ? 没有可迭代的对象了，下一次next就会报错
print(random.choice((10, 20, 30)))





